#ifndef UTILS_H_
#define UTILS_H_
#include <string>
#include <sstream>
#include <fstream>
#include <algorithm>
using namespace std;

namespace Entidades {

class Utils {

protected:

	Utils() {
	}

public:

	/* Lee el siguiente campo del stringstream
	 * Como es una string variable sería: tamañoDelString | string */
	static string ObtenerSiguienteStringVariable(stringstream* ss) {
		string toReturn;
		unsigned int* tamanioDelString = new unsigned int(0);
		char* temp = new char();

		// leo el tamaño del string
		ss->read((char*) tamanioDelString, sizeof(int));

		//leo y lleno el string de acuerdo al tamaño
		for (unsigned int i = 0; i < *tamanioDelString; i++) {
			ss->read(temp, sizeof(char));
			toReturn += *temp;
		}

		delete tamanioDelString;
		delete temp;
		return toReturn;
	}

	/* Lee el siguiente campo del stringstream
	 * Como es una string fija sería: string */
	static string ObtenerSiguienteStringFija(stringstream* ss, unsigned int tamanioDelString) {
		string toReturn;
		char* temp = new char();

		//leo y lleno el string de acuerdo al tamaño
		for (unsigned int i = 0; i < tamanioDelString; i++) {
			ss->read(temp, sizeof(char));
			toReturn += *temp;
		}

		delete temp;
		return toReturn;
	}
	static string convertirEnteroAString(int entero) {
		std::stringstream numeroAConvertir;
		string numeroConvertido;

		numeroAConvertir << entero;

		return numeroConvertido = numeroAConvertir.str();
	}

	static string aMinuscula(string& palabra) {

		for (unsigned i = 0; i < palabra.length(); i++) {
			palabra[i] = tolower(palabra[i]);
		}
		return palabra;
	}

	static string fechaDelDia() {
		char buffer[BUFSIZ] = { '\0' };
		time_t now = time(&now);
		struct tm* local_time = new tm();
		local_time = localtime(&now);
		sprintf(buffer, "%04d%02d%02d", local_time->tm_year + 1900, local_time->tm_mon + 1, local_time->tm_mday);
		string string(buffer);
		return string;
	}

	static void borrarCaracteresEspeciales(string& s) {
		fstream simbolosIndeseados;
		simbolosIndeseados.open("simbolosIndeseados.txt", ios::in);

		char cadena;
		while (!simbolosIndeseados.eof()) {
			simbolosIndeseados >> cadena;
			s.erase(std::remove(s.begin(), s.end(), cadena), s.end());
		}
		simbolosIndeseados.close();
	}

	enum ResultadoOperacionArbol {
		OK, SOBREFLUJO, ACTUALIZADO, SUBFLUJO, FUSION
	};

	~Utils() {
	}

};

}

#endif /* UTILS_H_ */
